'''
1. 请写出列表支持的所有方法及说明（例如: append 向列表末尾添加元素）
append(要添加的元素)  # 向列表末尾添加元素
insert(索引,要添加的元素) # 在指定索引的位置添加元素
extend(可迭代对象)   # 将可迭代对象里的元素一一加入到列表中
+：+号拼接，合并两个列表
*：*号复制列表中的元素

pop(索引)   #删除列表的元素，默认删除列表的最后一个元素
remove(要删除的元素) # 删除列表指定的元素
clear() # 直接清空列表
del list[索引]/list  #删除列表元素或者直接删除列表

sort(reverse=True)   # 对列表进行排序，默认升序
reverse()  # 对列表中的元素反转排序
copy()  # 复制列表

index(元素，[开始索引，结束索引])  # 从列表中找出元素第一个匹配项的索引位置，可以指定区间查找
count(元素)  # 统计某个元素在列表中出现的次数
len(list) # 计算列表的长度
max(list)  # 统计列表中元素的最大值
min(list)  # 统计列表中元素的最小值


2. 说明列表的浅拷贝和深拷贝的区别
浅拷贝：只能拷贝单层列表的元素，当列表中存在嵌套列表时，无法拷贝嵌套内列表的元素
import copy

lst1 = [1, 2, 3]
lst2 = copy.copy(lst1)
lst1[0] = 100  # lst1=[100,2,3]修改其中的一个元素的值，lst2=[1,2,3]并不会一起改变，列表是可变的数据类型，两个列表的内存地址不同
print(lst1 == lst2)  # False  判断两个列表中的值是否相等
print(lst1 is lst2)  # False  两个列表的内层地址不同

# 当存在二维列表的时候，修改二维列表中元素的值，列表会一起改变，其嵌套列表的内存地址浅拷贝时是相同的
lst3 = [[1, 2], 2, 3]
lst4 = copy.copy(lst3)
lst3[0][0] = 100
print(lst3 == lst4)  # True
print(lst3[0] is lst4[0])  # True，浅拷贝时只能拷贝第一层列表，二维列表无法跟着拷贝，和原来的内存地址是相同的


# 深拷贝：深拷贝会拷贝所有的可变的数据类型，包含嵌套在里面的数据，深拷贝是变量对应的值是复制在新的内存地址中
lst1 = [1, 2, 3]
lst2 = copy.deepcopy(lst1)
lst1[0] = 100  # lst1=[100,2,3]修改其中的一个元素的值，lst2=[1,2,3]并不会一起改变，列表是可变的数据类型，两个列表的内存地址不同
print(lst1 == lst2)  # False  判断两个列表中的值是否相等
print(lst1 is lst2)  # False  两个列表的内层地址不同


# 当存在二维列表的时候，修改二维列表中元素的值，列表并不会一起改变，其嵌套列表的内存地址深拷贝时是不同的
lst3 = [[1, 2], 2, 3]
lst4 = copy.deepcopy(lst3)
lst3[0][0] = 100
print(lst3 == lst4)  # False,lst3=[[100,2],2,3],lst4=[[1,2],2,3]
print(lst3[0] is lst4[0])  # False，深拷贝时二维列表的也会跟着去拷贝查询，是和原来的内存地址是不同的


3. 说明列表和元组的相同点和不同点
相同点：
    列表和元组都是一种有序的集合，都可以存储不同类型的数据
    列表和元组都可以遍历、索引、切片等操作
    列表和元组都可以使用+号、*号进行拼接操作，生成新的列表和元组
不同点：
    列表是可变的，元组是不可变的
    列表中的元素可以进行增删改查等操作，元组只能查询，不能修改
4. 请写出字符串支持的所有方法及说明（例如: lower 返回字符串的小写）

capitalize() 将字符串的第一个字母变成大写，其他字母变小写。
upper() 将字符串中的小写字母转为大写字母
title() 每个单词的首字母大写
lower() 将所有字母变成小写
swapcase() 大小写互换
startswith(元素) 判断是否以某个字符或字符串为开头，返回True或False
endswith(元素) 判断是否以某个字符或字符串结尾，返回True或False
center(宽度，要填充的字符) 返回一个指定的宽度居中的字符串，其他使用填充的字符补充，默认为空格。
zfill(宽度) 返回指定长度的字符串，原字符串右对齐，前面填充0。
rjust(宽度) 返回一个原字符串右对齐,并使用空格填充至长度的新字符串。如果指定的长度小于字符串的长度则返回原字符串。
ljust(宽度)  返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串。如果指定的长度小于原字符串的长度则返回原字符串。
strip(元素)  默认去掉首尾两边的空白符，带上元素,代表移除字符串中的哪个元素,但是只能移除头尾的,不能删除中间的
rstrip() 删除字符串末尾的指定字符，默认为空白符
split(元素,切片次数) 按照某字符将字符串分割成列表(默认字符是空格) ，从左到右切割
splitlines() 按照行('\r', '\r\n', \n')分隔，返回一个包含各行作为元素的列表，如果参数为 False，不包含换行符，如果为True，则保留换行符。
join(序列)  按某字符将序列中的元素拼接成字符串
replace(旧元素，新元素) 把字符串的旧字符换成新字符
count() 统计字符串中某个元素的数量
find() 查找某个字符串第一次出现的索引位置，如果元素不存在则返回-1
index() 查找某个字符串第一次出现的索引位置，可以指定开始和结束范围，如果元素不存在则报错
len()   返回字符串的长度
max()   返回字符串中最大的字母
min()   返回字符串中最小的字母
isupper() 判断字符串是否都是大写字母
islower() 判断字符串是否都是小写字母
istitle() 判断字符串是否每个单词都首字母大写
isdecimal() 判断字符串是否以十进制数字组成，必须是纯数字
isalnum() 判断字符串是否由字母、数字、汉字组成
isalpha() 判断字符串是否由字母、汉字组成
isdigit() 判断字符串是否只由数字组成
isnumeric() 判断字符串是否由数字组成，可以接收中文的四等
isspace()   判断字符串是否由空白符组成
decode() 以指定的编码格式解码字符串，默认用utf-8
encode() 以指定的编码格式编码字符串
'''

# 5. 有如下一个字符串变量logs，请统计出每种请求类型的数量（提示：空格分割的第2列是请求类型），得到如下输出：
# POST 2
# GET 3

# 下边是logs变量：
logs = '''
111.30.144.7 "POST /mock/login/?t=GET HTTP/1.1" 200 
111.30.144.7 "Get /mock/users/?t=POST HTTP/1.1" 200 
111.13.100.92 "Post /mock/login/ HTTP/1.1" 200 
223.88.60.88 "GET /mock/users/?t=POST HTTP/1.1" 200 
111.30.144.7 "GET /mock/users/ HTTP/1.1" 200 
'''
logs_split = logs.splitlines()
print(logs_split)
post_count = 0
get_count = 0
for i in logs_split:
    if i.strip().upper().count("POST", 0, 20):
        post_count += 1
    if i.strip().upper().count("GET", 0, 20):
        get_count += 1

print("POST {}\nGET {}".format(post_count, get_count))
